
export class Utils {

    static enableEncrypt = false;
    /**
     * 获取图片路径的后缀名
     * @param picture
     */
    static getImageType(picture: string) : string {
        const reg = /\.(png|jpg|gif|jpeg|webp|bmp|x-ms-bmp|psd|svg|tiff|ico)$/;
        const result = picture.match(reg);
        if (result !== null ) {
            return result[1];
        }
        return "png";
    }

    /**
     * 判断是不是图片
     * @param picture
     */
    // png|jpg|gif|jpeg|webp|bmp|x-ms-bmp|psd|svg|tiff|ico
    static isImage(picture: string): boolean | null {
        const reg = /\.(png|jpg|gif|jpeg|webp|bmp|x-ms-bmp|psd|svg|tiff|ico)$/;
        const result = picture.match(reg);
        return result && result.length === 2;
    }

    /**
     * 深度克隆数据
     * @param obj
     */
    static cloneObject(obj: any): any {
        if (obj === null) return null
        if (typeof obj !== 'object') return obj
        if (obj.constructor === Date) return new Date(obj)
        const newObj = new obj.constructor(); // 保持继承链
        for (const key in obj) {
            if (obj.hasOwnProperty(key)) { // 不遍历其原型链上的属性
                const val = obj[key]
                newObj[key] = typeof val === 'object' ? Utils.cloneObject(val) : val // 使用arguments.callee解除与函数名的耦合
            }
        }
        return newObj
    }

    /**
     * 格式化JSON对象
     * @param jsonData
     */
    static formatJSON(jsonData: any): object {
        if (typeof jsonData === "string") {
            return JSON.parse(jsonData);
        }
        return jsonData;
    }

    /**
     * png|jpg|gif|jpeg|webp|bmp|x-ms-bmp|psd|svg|tiff|ico
     * 判断文件明是否是图片
     * @param fileName
     */
    static isPicture(fileName: string): boolean {
        const index = fileName.lastIndexOf('.');
        const ext = fileName.substr(index + 1);
        return [
            'png', 'jpg', 'jpeg', 'bmp', 'gif', 'webp', 'psd', 'svg', 'tiff', 'ico', 'x-ms-bmp']
            .indexOf(ext.toLowerCase()) !== -1
    }

    /**
     *
     * @param urlData
     * @param fileName
     * @param fileType
     */
    static convertBase64UrlToImgFile (urlData: any, fileName: string, fileType: string) {
        // 转换为byte
        const bytes = window.atob(urlData)
        // 处理异常,将ascii码小于0的转换为大于0
        const ab = new ArrayBuffer(bytes.length)
        const ia = new Int8Array(ab)
        for (let i = 0; i < bytes.length; i++) {
            ia[i] = bytes.charCodeAt(i)
        }
        // 转换成文件，添加文件的type，name，lastModifiedDate属性
        const blob = new Blob([ab], { type: fileType })
        // @ts-ignore
        blob.lastModifiedDate = new Date()
        // @ts-ignore
        blob.name = fileName
        return blob
    }

    //引入的js文件
    static useTree() {
        // 给树的节点添加属性
        // 递归
        const filterAddParams = (tree: Array<any>, paramsName: string) => {
            if (!tree || !Array.isArray(tree)) return null; // 出口 3-1
            return tree.map((item) => {
                // 2-4 1-4
                item[paramsName] = false; // 1-1, 2-1
                item.children = filterAddParams(item.children, paramsName); // 1-2 2-2
                return item; // 2-3 1-3
            });
        };
        return {
            filterAddParams
        }
    }

    /**
     * 字符串是否以数字开头
     * @param str
     */
    static startWithNumber(str: string):boolean {
        return /^\d/.test(str);
    }

    /**
     * 字符串是否以数字加点开头
     * @param str
     */
    static startSerialNumber(str: string): boolean {
        return /^\d+\./.test(str);
    }
}
